home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_12_03 / allison2 / startup.asm < prev   
Encoding:
Assembly Source File  |  1994-01-26  |  4.4 KB  |  207 lines

  1. Listing 4
  2.     NAME    ROMSTART_TEXT
  3. ;
  4. ; example startup code for
  5. ; imbedded systems use
  6. ;
  7. ; segment classes
  8. ; High addrs (rom)
  9. ; 'BOOT'
  10. ;  ""
  11. ;  ""
  12. ; 'CODE'      _TEXT segment
  13. ;
  14. ; ram
  15. ;
  16. ; 'STACK'    UDATA_END segment
  17. ; 'BSS'      IDATA_END and UDATA_BEG segments
  18. ; 'CONST'
  19. ; 'DATA'     IDATA_BEG segment
  20. ; Rename object file output to c0x.obj
  21. ; where x = S,C,M,L, or H
  22. ; and locate in project subdirectory
  23. ;  Memory model selection set to 1 all others 0
  24. ;
  25. SMALLM    EQU 0
  26. COMPACTM EQU 0
  27. MEDIUMM    EQU 0
  28. LARGEM    EQU 1
  29. HUGEM    EQU 0
  30.  
  31. STACK_SIZE  EQU 1000H    ;set desired stack size
  32. __acrtused  equ 1       ;satisfy external reference
  33.  
  34.     PUBLIC  __acrtused
  35.  
  36. DGROUP GROUP IDATA_BEG, _DATA, CONST, IDATA_END,\
  37.           UDATA_BEG, _BSS, STACK, UDATA_END
  38. ; this segment marks beginning of rom code
  39. ROMSTART_BEG SEGMENT BYTE 'CODE'
  40. ROMSTART_BEG ENDS
  41.  
  42. IF SMALLM OR COMPACTM
  43. _TEXT SEGMENT BYTE PUBLIC 'CODE'
  44.     EXTRN   _main:NEAR        ;main program
  45. ASSUME CS:_TEXT
  46.  
  47. ENDIF
  48. IF MEDIUMM OR LARGEM OR HUGEM
  49.     EXTRN  _main:FAR  ;main c program
  50. _TEXT SEGMENT BYTE PUBLIC 'CODE'
  51.     ASSUME CS:_TEXT
  52. ENDIF
  53.  
  54.     ASSUME DS:DGROUP, SS:DGROUP
  55.     PUBLIC start
  56.  
  57. start    PROC  NEAR
  58.     cli
  59.     cld
  60. ;********************************************
  61. ;
  62. ;   do hardware initialization and ram check
  63. ;
  64. ;********************************************
  65.  
  66.     PUBLIC  init_ram
  67.  
  68. init_ram:
  69. ;**********
  70. ; transfer initialize data from rom to ram
  71. ;
  72.     MOV BX, SEG IDATA_BEG
  73.     MOV AX, SEG IDATA_END    ;data to init.
  74.     sub ax,bx
  75.     mov cl,3
  76.     shl ax,cl
  77.     mov cx,ax
  78.     jcxz    no_init_data
  79.  
  80. ;address of frame # in rom
  81.     mov ax, seg ENDCODE   ;needed for jbromldr
  82.     inc ax       ;ram init values begin at
  83.     mov ds,ax    ;segment ENDCODE + 1     
  84.     mov si,0
  85. ;address of frame # in ram
  86.     mov ax, seg IDATA_BEG
  87.     mov es,ax
  88.     mov di,0
  89. ; initialize data and const segments
  90. rep movsw   ;word transfer
  91. no_init_data:    
  92.     mov bx, seg UDATA_BEG  ;clear bss data
  93.     mov ax, seg UDATA_END
  94.     sub ax, bx
  95.     mov cl,3
  96.     shl ax,cl
  97.     mov cx,ax
  98.     jcxz no_zerodata
  99.     mov es,bx
  100.     mov di,0
  101.     mov ax,0
  102. rep stosw
  103.     PUBLIC  no_zerodata
  104. no_zerodata:
  105.     mov ax,DGROUP  ; set up stack
  106.     mov ds,ax
  107.     mov ss,ax
  108.     mov sp,OFFSET DGROUP:STACK_TOP
  109. ;*********************************************
  110. ;  add code to:
  111. ;   1) initialize INITDATA Functions (see c0.asm)
  112. ;   2) capture interrupt vectors 0-4
  113. ;*********************************************
  114.     sti     ;enable interrupts
  115.     call _main    ;enter main program
  116. ;*********************************************
  117. ;  add code to:
  118. ;   1) shut down EXITDATA Functions
  119. ;   2) handle shutdown errors
  120. ;   3) prepare to restart
  121. ;*********************************************
  122.     jmp start
  123. start ENDP
  124. _abort          PROC    DIST
  125.         PUBLIC  _abort
  126. ;handle error abort
  127.     jmp start
  128. _abort ENDP
  129. IF SMALLM OR COMPACTM
  130. _TEXT ENDS 
  131. ENDIF
  132. IF MEDIUMM OR LARGEM OR HUGEM
  133. _TEXT ENDS
  134. ENDIF
  135.  
  136. ; segment marks end of rom code
  137. ;make it non zero, length < 16 bytes 
  138. ENDCODE SEGMENT PARA PUBLIC 'ENDCODE'
  139.        db  "ENDROM"   ;seg ENDCODE+1 = begin ram
  140. ENDCODE ENDS
  141. ;*********************************
  142.  
  143. ;beginning of dgroup and initialized data in ram
  144.  
  145. IDATA_BEG   SEGMENT PARA PUBLIC 'IDATA_BEG'
  146. IDATA_BEG   ENDS
  147.  
  148. _FARDATA    SEGMENT PARA PUBLIC 'FAR_DATA'
  149. _FARDATA    ENDS
  150.  
  151. _DATA    SEGMENT PARA PUBLIC 'DATA'
  152. _DATA    ENDS
  153.  
  154. _CVTSEG SEGMENT WORD PUBLIC 'DATA'
  155.   PUBLIC __RealCvtVector
  156. __RealCvtVector label word
  157. _CVTSEG    ENDS
  158. _SCNSEG    SEGMENT WORD PUBLIC 'DATA'
  159. _SCNSEG    ENDS
  160.  
  161. CONST    SEGMENT WORD PUBLIC 'CONST'
  162. CONST    ENDS
  163.  
  164. _INIT_    SEGMENT WORD PUBLIC 'INITDATA'
  165. _INIT_  ENDS
  166. _INITEND_ SEGMENT WORD PUBLIC 'INITDATA'
  167. _INITEND_ ENDS
  168.  
  169. _EXIT_  SEGMENT WORD PUBLIC 'EXITDATA'
  170. _EXIT_  ENDS
  171.  
  172. _EXITEND_ SEGMENT WORD PUBLIC 'EXITDATA'
  173. _EXITEND_ ENDS
  174.  
  175. IDATA_END SEGMENT PARA PUBLIC 'IDATA_END'
  176. IDATA_END ENDS
  177.  
  178. ; end of initialized data
  179.  
  180. UDATA_BEG SEGMENT WORD PUBLIC 'UDATA_BEG'
  181. UDATA_BEG ENDS
  182.  
  183. _BSS    SEGMENT WORD PUBLIC 'BSS'
  184. _BSS    ENDS 
  185. _BSSEND    SEGMENT BYTE PUBLIC 'BSSEND'
  186. _BSSEND    ENDS
  187.  
  188. STACK    SEGMENT PARA STACK 'STACK'
  189.     DW    STACK_SIZE DUP (?)
  190.  
  191. STACK_TOP   LABEL WORD
  192. STACK    ENDS
  193.  
  194. ; end of initialized segment in ram
  195. UDATA_END SEGMENT WORD PUBLIC 'UDATA_END'
  196. UDATA_END   ENDS
  197. ; bootstrap address for powerup reset
  198. ; far jump to program beginning
  199. ; may have to be manually placed in EPROM
  200. ;BOOTSTRAP   SEGMENT AT 0FFFFH
  201. ;    JMP FAR PTR start
  202. ;
  203. ;BOOTSTRAP ENDS
  204.     end start
  205.  
  206.